package br.com.controller.aula;

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.data.hibernate.AulaHibernateDAO;
import br.com.data.hibernate.AvaliacaoHibernateDAO;
import br.com.data.hibernate.DesempenhoHibernateDAO;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Avaliacao;
import br.com.model.entidade.Desempenho;

@ManagedBean
@ViewScoped
public class MBGerenciarAvaliacao extends AbstractMBean<Avaliacao> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Date data;
	private Avaliacao avaliacao;
	private AvaliacaoHibernateDAO avaliacaoHibernateDAO;
	
	private DesempenhoHibernateDAO desempenhoHibernateDAO;
	
	private AulaHibernateDAO aulaHibernateDAO;
	private List<Avaliacao> avaliacoes;
	private boolean editavel;

	@ManagedProperty(value = "#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;

	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}

	public MBGerenciarAvaliacao() {
		this.avaliacaoHibernateDAO = (AvaliacaoHibernateDAO) getBean("avaliacaoHibernateDAO");
		this.aulaHibernateDAO = (AulaHibernateDAO) getBean("aulaHibernateDAO");
		this.desempenhoHibernateDAO = (DesempenhoHibernateDAO) getBean("desempenhoHibernateDAO");
		
		this.avaliacao = new Avaliacao();


		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Long idAula = (Long) session.getAttribute("idAulaVizualizacao");
		session.removeAttribute("idAvaliacao");

		if (idAula == null) {
			try {
				FacesContext.getCurrentInstance().getExternalContext()
						.redirect("/educacao/pages/professor/index.jsf");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			this.avaliacao.setAula(this.aulaHibernateDAO.getById(Aula.class,
					idAula));
			avaliacoes = avaliacaoHibernateDAO.getByField(Avaliacao.class,
					"aula", avaliacao.getAula());
		}

	}

	public boolean isEditavel() {
		return editavel;
	}

	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}

	public void cadastrar() {
		try {
			Calendar c = Calendar.getInstance();
			c.setTime(data);
			this.avaliacao.setData(c);
			avaliacao.setBimestre(avaliacao.getAula().getBimestreCorrente());
			serviceCadastro.salvar(this.avaliacao);
			this.limpar();
			addFacesInformationMessage("Avaliação cadastrada com sucesso");
		} catch (BDException e) {
			// TODO: handle exception
			addFacesErrorMessage("Erro ao cadastrar");
		}
	}

	public void irEditar() {
		this.data = avaliacao.getData().getTime();
		this.editavel = true;
	}

	public void limpar() {
		Aula aulaAux = this.avaliacao.getAula();
		this.avaliacao = new Avaliacao();
		this.avaliacao.setAula(aulaAux);
		this.data = null;
		this.editavel = false;
		this.avaliacoes = avaliacaoHibernateDAO.getByField(Avaliacao.class,
				"aula", avaliacao.getAula());
	}
	
	public void irInserirNota(){
		if (desempenhoHibernateDAO.getByField(Desempenho.class, "avaliacao", this.avaliacao).isEmpty()){
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
			session.setAttribute("idAvaliacao", this.avaliacao.getId());
			
			try {
				FacesContext.getCurrentInstance().getExternalContext().redirect("/educacao/pages/professor/turma/inserirNotas.jsf");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			this.avaliacao = new Avaliacao();
			addFacesInformationMessage("Não é possível inserir. Já foram inseridas notas para essa avaliação.");
		}
		
	}
	
	public void irEditarNota(){
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		session.setAttribute("idAvaliacao", this.avaliacao.getId());
		
		System.out.println(this.avaliacao.getId());
		
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect("/educacao/pages/professor/turma/editarNotas.jsf");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void editar() {
		try {
			Calendar c = Calendar.getInstance();
			c.setTime(data);
			this.avaliacao.setData(c);
			serviceCadastro.atualizar(avaliacao);
			this.limpar();
			addFacesInformationMessage("Avaliação editada com sucesso");
		} catch (BDException e) {
			// TODO: handle exception
			addFacesErrorMessage("Erro ao editar");
		}
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public Avaliacao getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(Avaliacao avaliacao) {
		this.avaliacao = avaliacao;
	}

	public List<Avaliacao> getAvaliacoes() {
		return avaliacoes;
	}

	public void setAvaliacoes(List<Avaliacao> avaliacoes) {
		this.avaliacoes = avaliacoes;
	}

}
